home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
c
/
recio202.zip
/
rget.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-05
|
21KB
|
564 lines
/*****************************************************************************
MODULE: rget.c
PURPOSE: recio input functions
COPYRIGHT: (C) 1994 William Pierpoint
COMPILER: Borland C Version 3.1
OS: MSDOS Version 6.2
VERSION: 2.02
RELEASE: May 5, 1994
*****************************************************************************/
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "recio.h"
extern int _rstatus(REC *rp, int mode);
extern int _rismode(REC *rp, int mode);
extern void _rsetexitfn(REC *rp);
/* private macros */
#define RECBUFSIZ_MIN 2 /* min one character and new line */
#define FLDBUFSIZ_MIN 1 /* min one character */
#define RECBUFSIZE max(RECBUFSIZ, RECBUFSIZ_MIN)
#define FLDBUFSIZE max(FLDBUFSIZ, FLDBUFSIZ_MIN)
#define rcol(rp) ((rp)->r_colno)
#define rflags(rp) ((rp)->r_flags)
#define rfd(rp) ((rp)->r_fd)
#define rfp(rp) ((rp)->r_fp)
#define rreclen(rp) ((rp)->r_reclen)
#define rrecsiz(rp) ((rp)->r_recsiz)
#define rfldsiz(rp) ((rp)->r_fldsiz)
#define rfldch(rp) ((rp)->r_fldch)
#define rtxtch(rp) ((rp)->r_txtch)
/****************************************************************************/
static int /* return error number (0=no error) */
_rsetfldsiz( /* set field buffer size */
REC *rp, /* record pointer */
size_t fldsiz) /* field buffer size */
/****************************************************************************/
{
int errnum=0; /* error number */
char *fldp; /* pointer to new field buffer */
/* if no memory allocated to field buffer */
if (!rflds(rp)) {
/* determine minimum size of field buffer */
fldsiz = max(fldsiz, FLDBUFSIZE);
/* initially allocate memory for field buffer */
do {
fldp = (char *) calloc(fldsiz+1, sizeof(char));
if (!fldp) {
errnum = rseterr(rp, R_ENOMEM);
if (errnum) goto done;
}
} while (!fldp);
rflds(rp) = fldp;
rfldsiz(rp) = fldsiz;
_rsetexitfn(rp);
/* if field buffer needs to be larger */
} else if (fldsiz > rfldsiz(rp)) {
/* reallocate memory for field buffer */
do {
fldp = (char *) realloc(rflds(rp), fldsiz+1);
if (!fldp) {
errnum = rseterr(rp, R_ENOMEM);
if (errnum) goto done;
}
} while (!fldp);
rflds(rp) = fldp;
rfldsiz(rp) = fldsiz;
}
done:
return (errnum);
}
/****************************************************************************/
static int /* return error number (0=no error) */
_rsetrecsiz( /* set record buffer size */
REC *rp, /* record pointer */
size_t recsiz) /* record buffer size */
/****************************************************************************/
{
int errnum=0; /* error number */
char *recp; /* pointer to new record buffer */
/* if no memory allocated to field buffer */
if (!rrecs(rp)) {
/* determine minimum size of record buffer */
recsiz = max(recsiz, RECBUFSIZE);
/* initially allocate memory for record buffer */
do {
recp = (char *) calloc(recsiz+1, sizeof(char));
if (!recp) {
errnum = rseterr(rp, R_ENOMEM);
if (errnum) goto done;
}
} while (!recp);
rrecs(rp) = recp;
rrecsiz(rp) = recsiz;
_rsetexitfn(rp);
/* if record buffer needs to be larger */
} else if (recsiz > rrecsiz(rp)) {
/* reallocate memory for record buffer */
do {
recp = (char *) realloc(rrecs(rp), recsiz+1);
if (!recp) {
errnum = rseterr(rp, R_ENOMEM);
if (errnum) goto done;
}
} while (!recp);
rrecs(rp) = recp;
rrecsiz(rp) = recsiz;
}
done:
return (errnum);
}
/****************************************************************************/
static int /* return !0 on match */
isfldch( /* is character the field separator character? */
REC *rp, /* record pointer */
int ch) /* character to test */
/****************************************************************************/
{
int ismatch=0; /* return 0 if no match */
if (isascii(ch)) {
if (rfldch(rp) == ' ') {
ismatch = isspace(ch);
} else {
ismatch = (!(ch - rfldch(rp)));
}
}
return (ismatch);
}
/****************************************************************************/
static int /* return !0 on match */
istxtch( /* is character the text delimiter character? */
REC *rp, /* record pointer */
int ch) /* character to test */
/****************************************************************************/
{
int ismatch=0; /* return 0 if no match */
if (isascii(ch)) {
if (rtxtch(rp) == ' ') {
ismatch = isspace(ch);
} else {
ismatch = (!(ch - rtxtch(rp)));
}
}
return (ismatch);
}
/****************************************************************************/
static size_t /* return length of field */
_rfldlen( /* get length of field */
REC *rp) /* record pointer */
/****************************************************************************/
{
size_t len=0; /* length of field (0=missing field)*/
size_t col; /* column location */
int ch; /* character at column location */
int qstate=0; /* quoted string state (0=off; 1=on) */
/* get column location for first non-whitespace character in field */
for (col=rcol(rp); col < rreclen(rp); col++) {
if (!isspace(rrecs(rp)[col])) break;
}
/* find field separator at end of field */
if (istxtch(rp, ' ')) {
for (; col < rreclen(rp); col++) {
ch = rrecs(rp)[col];
if (isfldch(rp, ch)) break;
}
} else {
for (; col < rreclen(rp); col++) {
ch = rrecs(rp)[col];
/* don't search for fldch between txtch's */
if (istxtch(rp, ch)) qstate = !qstate;
if (!qstate && isfldch(rp, ch)) break;
}
}
/* get length of field */
if (rcol(rp) < rreclen(rp)) {
len = col - rcol(rp) + 1;
}
return (len);
}
/****************************************************************************/
static int /* return error state (0=no error) */
_rskipfld( /* skip to the next field */
REC *rp, /* record pointer */
size_t len) /* length of field if known, 0 if unknown */
/****************************************************************************/
{
int err=0; /* error state (0=no error; EOF=past end-of-record) */
/* if length of field is unknown */
if (!len) {
/* determine length */
len=_rfldlen(rp);
}
/* if not at end of record */
if (rcol(rp) <= rreclen(rp)) {